/*
 * Copyright 2008 ZXing authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*namespace com.google.zxing.qrcode.encoder {*/

import ErrorCorrectionLevel from './../decoder/ErrorCorrectionLevel'
import Mode from './../decoder/Mode'
import Version from './../decoder/Version'
import StringBuilder from './../../util/StringBuilder'
import ByteMatrix from './ByteMatrix'

/**
 * @author satorux@google.com (Satoru Takabayashi) - creator
 * @author dswitkin@google.com (Daniel Switkin) - ported from C++
 */
export default class QRCode {

  public static NUM_MASK_PATTERNS = 8

  private mode: Mode
  private ecLevel: ErrorCorrectionLevel
  private version: Version
  private maskPattern: number /*int*/
  private matrix: ByteMatrix

  public constructor() {
    this.maskPattern = -1
  }

  public getMode(): Mode {
    return this.mode
  }

  public getECLevel(): ErrorCorrectionLevel {
    return this.ecLevel
  }

  public getVersion(): Version {
    return this.version
  }

  public getMaskPattern(): number /*int*/ {
    return this.maskPattern
  }

  public getMatrix(): ByteMatrix {
    return this.matrix
  }

  /*@Override*/
  public toString(): string {
    const result = new StringBuilder()//(200)
    result.append("<<\n")
    result.append(" mode: ")
    result.append(this.mode ? this.mode.toString() : "null")
    result.append("\n ecLevel: ")
    result.append(this.ecLevel ? this.ecLevel.toString() : "null")
    result.append("\n version: ")
    result.append(this.version ? this.version.toString() : "null")
    result.append("\n maskPattern: ")
    result.append(this.maskPattern.toString())
    if (this.matrix) {
      result.append("\n matrix:\n");
      result.append(this.matrix.toString())
    } else {
      result.append("\n matrix: null\n")
    }
    result.append(">>\n")
    return result.toString()
  }

  public setMode(value: Mode): void {
    this.mode = value
  }

  public setECLevel(value: ErrorCorrectionLevel): void {
    this.ecLevel = value
  }

  public setVersion(version: Version): void {
    this.version = version
  }

  public setMaskPattern(value: number /*int*/): void {
    this.maskPattern = value
  }

  public setMatrix(value: ByteMatrix): void {
    this.matrix = value
  }

  // Check if "mask_pattern" is valid.
  public static isValidMaskPattern(maskPattern: number /*int*/): boolean {
    return maskPattern >= 0 && maskPattern < QRCode.NUM_MASK_PATTERNS
  }

}
